當使用Odoo開發模塊時,繼承是一個非常重要的概念,它允許你擴展現有的功能或修改現有的模型,同時保留原始模型的所有功能。在Odoo中,有三種常見的繼承方式,分別是類繼承(class inheritance),原型繼承(prototype inheritance)和委託繼承(delegation inheritance)。讓我們更深入地了解這些概念:
類繼承(Class Inheritance):
介紹:類繼承是透過Python類的繼承機制實現的。你可以創建一個新的類別,繼承一個現有的Odoo模型類別,通常是models.Model的基本模型類別。然後,你可以在新類別中新增新的欄位、方法和屬性,同時也可以覆寫或擴展父類別中的方法。這種繼承方式允許你以物件導向的方式修改模型的行為。
範例:在上述範例中,我們創建了一個新的ProductInherit類,並通過_inherit屬性指定它要繼承的基本模型為product.product,然後新增了一個production_date欄位用於記錄產品的生產日期。
原型繼承(Prototype Inheritance):
介紹:原型繼承用於在視圖層級上進行微調和個性化定制。你可以創建一個新的視圖,將其原型指向一個現有的視圖,從而繼承原視圖的結構和屬性。然後,你可以在新視圖中新增、修改或刪除欄位、控制元件等,以滿足特定需求。
範例:在上述範例中,我們創建了一個名為view_sale_order_inherit的新視圖,並將其原型指向現有的銷售訂單視圖sale.view_order_form。然後,我們在新視圖中新增了一個名為custom_note的欄位,用於備註特定訂單的重要資訊。
委託繼承(Delegation Inheritance):
介紹:委託繼承允許你創建一個新的模型,將其基礎模型指向一個現有的模型,從而繼承基礎模型的欄位、方法和行為。然後,你可以在新模型中新增額外的欄位、方法等,甚至覆寫基礎模型的方法,以滿足特定的定制需求。
範例:在上述範例中,我們創建了一個名為CustomPartner的新模型,並通過_inherit屬性指定它要繼承的基礎模型為res.partner,然後新增了一個special_category欄位,用於存儲客戶的特殊分類。
這三種繼承方式在Odoo開發中非常常見,它們允許你保持代碼的模組化和可維護性,同時在不修改原始模型代碼的情況下擴展和自定義功能。當需要在Odoo中進行自定義開發時,了解如何使用這些繼承方式將對你非常有幫助。此外,你還可以通過觀看Odoo的官方文檔和示例代碼來深入了解這些概念。
from odoo import models, fields
class ProductInherit(models.Model):
_inherit = 'product.product'
production_date = fields.Date(string="Production Date")
<record id="view_sale_order_inherit" model="ir.ui.view">
<field name="name">sale.order.inherit</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<field name="partner_id" position="after">
<field name="custom_note" string="Custom Note"/>
</field>
</field>
</record>
from odoo import models, fields
class CustomPartner(models.Model):
_name = 'custom.partner'
_description = 'Custom Partner'
_inherit = 'res.partner'
special_category = fields.Char(string="Special Category")